using Godot;
using System;
using Smr.枚举;
using Smr.基类;
using Smr.索引;
using Smr;
using System.Collections.Generic;

public partial class 装备拆分 : PanelContainer
{
	[Export] private 组件道具选项垂直容器 道具选项容器;
	[Export] private 组件道具 操作道具组件;
	[Export] private Label 操作道具标签;
	[Export] private Label[] 附加属性标签;
	[Export] private 组件道具 拆分道具组件;
	[Export] private Button 拆分按钮;
	[Export] private Label 消耗标题标签;

	public override void _Ready()
	{
		操作道具组件.MouseFilter = MouseFilterEnum.Ignore;
		拆分道具组件.MouseFilter = MouseFilterEnum.Ignore;
		foreach (var 附加属性 in 附加属性标签)
		{
			附加属性.AddThemeColorOverride("font_color", new Color(配置.附加属性标签颜色));
		}
		var 拆分道具 = 道具模型.取模型(E道具索引.拆分石);
		拆分道具组件.置道具(拆分道具, E道具位置.装备拆分);
		拆分道具.当前数量 = 游戏管理.背包实例.取背包道具总数((int)E道具索引.拆分石, E背包道具使用状态.未使用);
		拆分按钮.Pressed += 拆分按钮被点击;
		消耗标题标签.Text = $"消耗阴德: {配置.装备拆分阴德消耗}    拥有: {游戏存档.玩家.基础属性.阴德}";
	}

	public void 初始化()
	{
		道具选项容器.清空选项();
		操作道具组件.清空组件();
		清空附加属性标签文本();
		拆分道具组件.置道具当前数量(游戏管理.背包实例.取背包道具总数((int)E道具索引.拆分石, E背包道具使用状态.未使用));
		foreach (var 道具 in 游戏存档.背包)
		{
			// 判断道具是否符合拆分条件
			if (道具.类型 == E道具类型.装备)
			{
				C装备模型 背包装备 = (C装备模型)道具;
				if (背包装备.附加属性.Count > 0)
				{
					置选项组件属性(背包装备);
				}
			}
		}
	}

	private void 置选项组件属性(C装备模型 背包装备)
	{
		组件道具选项 道具选项实例 = 道具选项容器.创建选项实例();
		道具选项实例.道具组件.置道具(背包装备, E道具位置.装备拆分);
		道具选项实例.标识一标签.Text = 背包装备.名称;
		道具选项实例.标识二标签.Text = 背包装备.称谓要求.ToString();
		道具选项实例.标识三标签.Text = 背包装备.部位.ToString();
		道具选项实例.信号被点击 += 道具组件 =>
		{
			操作道具组件.置道具(道具组件.取道具(), E道具位置.装备拆分);
			拆分道具组件.置道具当前数量(游戏管理.背包实例.取背包道具总数((int)E道具索引.拆分石, E背包道具使用状态.未使用));
			更新附加属性显示(背包装备.附加属性);
			操作道具标签.Text = 道具组件.取道具().名称;
		};
	}

	private void 更新附加属性显示(List<结构.装备属性> 附加属性)
	{
		清空附加属性标签文本();
		for (int i = 0; i < 附加属性.Count; i++)
		{
			置附加属性标签(附加属性标签[i], 附加属性[i]);
		}
	}

	private void 清空附加属性标签文本()
	{
		foreach (var 标签 in 附加属性标签)
		{
			标签.Text = "";
		}
	}

	private void 置附加属性标签(Label 附加属性标签, 结构.装备属性 装备属性)
	{
		附加属性标签.Text = 装备属性.属性名 + "：" + 装备属性.当前值 + " / " + 装备属性.上限值;
	}

	private void 拆分按钮被点击()
	{
		// 从道具场景取出待拆分的道具模型
		C装备模型 拆分装备 = (C装备模型)操作道具组件.取道具();
		if (拆分装备 == null)
		{
			游戏管理.日志实例.置关键字文本("待拆分", "未选择", "的装备！", "red");
			return;
		}

		// 从背包数组中取未使用的拆分石组件实例, 如返回null, 则提示数量不足
		C装备模型 拆分道具 = (C装备模型)游戏管理.背包实例.取指定索引背包配置成员(E道具索引.拆分石, E背包道具使用状态.未使用);
		if (拆分道具 == null)
		{
			游戏管理.日志实例.置关键字文本(E道具索引.拆分石.ToString(), "所需要的", "数量不足！", "red");
			return;
		}

		// 判断玩家阴德是否充足
		if (游戏存档.玩家.基础属性.阴德 < 配置.装备拆分阴德消耗)
		{
			游戏管理.日志实例.置关键字文本("阴德", "所需要的", "数量不足！", "red");
			return;
		}

		int 拆分的随机属性索引 = 方法.取随机数.Next(0, 拆分装备.附加属性.Count);

		// 从拆分道具实例中获取道具模型, 并把拆分下来的属性赋值给道具
		拆分道具.已使用 = true;
		拆分道具.附加属性.Clear();
		拆分道具.部位 = 拆分装备.部位;
		拆分道具.称谓要求 = 拆分装备.称谓要求;
		拆分道具.附加属性.Add(拆分装备.附加属性[拆分的随机属性索引]);

		// 删除拆分装备中对应的战斗属性
		拆分装备.附加属性.RemoveAt(拆分的随机属性索引);

		// 判断成功几率
		if (方法.取概率结果(配置.装备拆分成功几率))
		{
			游戏管理.日志实例.置成功文本("恭喜您，装备拆分成功！");
		}
		else
		{
			// 拆分失败, 删除拆分道具
			游戏管理.背包实例.删道具(拆分道具.UUID);
			游戏管理.日志实例.置失败文本("很遗憾，装备拆分失败！");
		}

		// 判断还有没有附加属性 如果没有就删除装备
		if (拆分装备.附加属性.Count <= 0)
		{
			道具选项容器.删选项(拆分装备.UUID);
			游戏管理.背包实例.删道具(拆分装备.UUID);
			操作道具组件.清空组件();
			清空附加属性标签文本();
			操作道具标签.Text = "请选择待拆分的装备";
		}
		else
		{
			更新附加属性显示(拆分装备.附加属性);
		}

		// 减去所需要的消耗
		游戏存档.玩家.基础属性.阴德 -= 配置.装备拆分阴德消耗;

		// 更新UI
		拆分道具组件.置道具当前数量(游戏管理.背包实例.取背包道具总数((int)E道具索引.拆分石, E背包道具使用状态.未使用));
		消耗标题标签.Text = $"消耗阴德: {配置.装备拆分阴德消耗}    拥有: {游戏存档.玩家.基础属性.阴德}";
		游戏管理.背包实例.刷新背包(游戏管理.背包实例.取选项卡索引());
		游戏管理.玩家实例.更新玩家基础属性();
	}
}
